//
// Created by Administrator on 2020/7/8.
//数据的共享及保护
//类的友元
//1.友元是C++提供的一种破坏数据封装和数据隐藏的机制
//2.通过一个模板声明为另一个模板的友元,一个模板能够引用到另一个模板中本是被隐藏的信息
//3.可以声明友元函数和友元类
//4.为了确保数据的完整性,及数据封装与隐藏的原则,建议慎用友元
//友元函数
//1.友元函数时在类声明中由关键字friend修饰说明的非成员函数,在它的函数体中能够通过对象名访问private和protected成员
//2.作用：增加灵活性,使程序员可以在封装和快速性方面做合理选择
//3.访问对象中的成员必须通过对象名

#include <iostream>
#include <cmath>
using namespace std;
class Point//Point类声明
{
public://外部接口
    Point(int x=0,int y=0):x(x),y(y){}//构造函数
    int getX(){return x;}
    int getY(){return y;}
    friend float dist(Point &a,Point &b);//类的友元
private:
    int x,y;
};
float dist(Point &a,Point &b)//友元函数
{
    double x=a.x-b.x;
    double y=a.y-b.y;
    return static_cast<float>(sqrt(x*x+y*y));
}
int main()
{
    Point p1(1,1),p2(4,5);
    cout<<"The distance is:";
    cout<<dist(p1,p2)<<endl;
    return 0;
}
//友元类
/*
class A
{
	friend class B;//友元给B开权限,让B来访问A
	public:
		void display()
		{
			cout<<x<<endl;
		}
	private：
		int x;
};
class B
{
	public:
		void set(int i);
		void display();
	private:
		A a;
};
void B::set(int i)
{
	a.x=i;
}
void B::display()
{
	a.display();
}
*/
//注意：1.若一个类为另一个类的友元,则此类的所有成员都能访问对方类的私有成员
//      2.声明语法：将友元类名在另一个类中使用friend修饰说明
//      类的友元关系是单向的：声明B类是A类的友元≠A类是B类的友元
